IaCで一貫したタグ付けを自動化するためのOSS、Yorを試してみた
こんにちは。枡川です。
CloudFormationやTerraformなどIaCテンプレートへの一貫したタグ付けを行うためのOSSであるYorについて試してみました。
Bridgecrewが管理しているGo製のOSSになります。
このOSSには単にタグ付けを便利にしようという所に留まらず、Gitから引っ張った情報を適切に付与してトレーサビリティを上げようというコンセプトがあります。
タグの種類
Yorには下記3種類のタグ付け機能が存在します。
Tracing Tagger
Yor実行時にyor_traceという一意のIDを生成します。
IaCのテンプレートとクラウド上のリソースをIDで結びつけることを可能にします。
Git-based Tagger
いつ誰のコミットで対象リソースが変更されたかについて記録したタグをリソースに付加します。
クラウド上のリソースについて誰が所有しているかなどの情報を得ることができます。
Custom Taggers
ユーザーが各自でタグを定義することができます。
全リソースにenvタグを付加したりすることが可能です。
環境変数や設定ファイルを使用して定義します。
Custom Taggersはタグの付け忘れ防止に役立ち、便利さを簡単に実感できる部分だと思います。
その上で、Traicing TaggerやGit-based Taggerを使用することでIacテンプレートとクラウド上のリソースのトレーサビリティを高めることができます。
誰がいつ変更したのか、これらのリソースは誰が所有しているのか、Github等を見に行けば情報にたどり着けるのですが、より簡単に情報にたどり着くための手助けをしてくれます。
インストール
macの場合はhomebrew経由でインストール可能です。
brew tap bridgecrewio/tap brew install bridgecrewio/tap/yor
Dockerも用意されています。
docker pull bridgecrew/yor docker run --tty --volume /local/path/to/tf:/tf bridgecrew/yor tag --directory /tf
インストールしてyorコマンドを実行してみます。
2022/1/28時点の最新版は0.1.133でした。
(月に複数回バージョンアップが入っていて、現在活発に開発されている最中であることがわかります。)
$ yor NAME: yor - enrich IaC files with tags automatically USAGE: yor [global options] command [command options] [arguments...] VERSION: 0.1.133 DESCRIPTION: Yor, the IaC auto-tagger AUTHOR: Bridgecrew <[email protected]> COMMANDS: list-tags List the tags yor will create if possible list-tag-groups List the tag groups that will be applied by yor tag apply tagging across your directory help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help (default: false) --version, -v print the version (default: false)
試してみた
タグの設定一覧を確認します。
記載のある内容をタグ付けしてくれます。
$ yor list-tags +------------+----------------------+--------------------------------+ | GROUP | TAG KEY | DESCRIPTION | +------------+----------------------+--------------------------------+ | simple | | | +------------+----------------------+--------------------------------+ | external | | | +------------+----------------------+--------------------------------+ | code2cloud | yor_trace | A UUID tag that allows easily | | | | finding the root IaC config of | | | | the resource | +------------+----------------------+--------------------------------+ | git | git_org | The entity which owns the | | | | repository where this resource | | | | is provisioned in IaC | + +----------------------+--------------------------------+ | | git_repo | The repository where this | | | | resource is provisioned in IaC | + +----------------------+--------------------------------+ | | git_file | The file (including path) | | | | in the repository where this | | | | resource is provisioned in IaC | + +----------------------+--------------------------------+ | | git_commit | The hash of the latest commit | | | | which edited this resource | + +----------------------+--------------------------------+ | | git_modifiers | The users who modified this | | | | resource | + +----------------------+--------------------------------+ | | git_last_modified_at | The last time this resource's | | | | configuration was modified | + +----------------------+--------------------------------+ | | git_last_modified_by | The last user who modified | | | | this resource | +------------+----------------------+--------------------------------+
下記のようなEC2を構築する簡単テンプレートを使用して、タグ付けを実施してみます。
Resources: # ------------------------------------------------------------# # EC2 # ------------------------------------------------------------# IAMRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "ec2.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore RoleName: !Sub ${SystemName}-${EnvironmentName}-ec2-role Tags: - Key: Name Value: !Sub ${SystemName}-${EnvironmentName}-ec2-role myInstanceProfile: Type: "AWS::IAM::InstanceProfile" Properties: Path: "/" Roles: - !Ref IAMRole EC2: Type: "AWS::EC2::Instance" Properties: ImageId: !Ref AMI InstanceType: !Ref InstanceType KeyName: !Ref KeyName BlockDeviceMappings: - DeviceName: /dev/xvda Ebs: VolumeType: gp3 VolumeSize: 30 DeleteOnTermination: true SecurityGroupIds: - { "Fn::ImportValue": !Sub "${EnvironmentName}-EC2SG" } SubnetId: { "Fn::ImportValue": !Sub "${EnvironmentName}-PublicSubnet1" } IamInstanceProfile: !Ref myInstanceProfile Tags: - Key: Name Value: !Sub ${SystemName}-${EnvironmentName}-ec2 EIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref EC2 Tags: - Key: Name Value: !Sub ${SystemName}-${EnvironmentName}-eip
下記のようなタグが生成されて、テンプレートに付加されました。
yor tag -d . __ __ \ \ / / \ \/ /___ _ ____ \ / _ \| |/ __| | | |_| | / |_|\____/|__|v0.1.133 Yor Findings Summary Scanned Resources: 4 New Resources Traced: 3 Updated Resources: 0 New Resources Traced (3): +---------+----------+----------------------+------------------------------------------+--------------------------------------+ | FILE | RESOURCE | TAG KEY | TAG VALUE | YOR ID | +---------+----------+----------------------+------------------------------------------+--------------------------------------+ | ec2.yml | EIP | yor_trace | f8abc20a-492b-4fcf-9da8-4384e28b8bf8 | f8abc20a-492b-4fcf-9da8-4384e28b8bf8 | + + +----------------------+------------------------------------------+ + | | | git_file | ec2.yml | | + + +----------------------+------------------------------------------+ + | | | git_commit | 26e358cfd4a3bd61069350b4f5828129625cf92e | | + + +----------------------+------------------------------------------+ + | | | git_modifiers | masukawa.kentaro | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_at | 2022-01-25 02:29:12 | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxx | | + +----------+----------------------+------------------------------------------+--------------------------------------+ | | IAMRole | yor_trace | a754d004-7e1d-4246-9796-9287bf571de5 | a754d004-7e1d-4246-9796-9287bf571de5 | + + +----------------------+------------------------------------------+ + | | | git_file | ec2.yml | | + + +----------------------+------------------------------------------+ + | | | git_commit | 26e358cfd4a3bd61069350b4f5828129625cf92e | | + + +----------------------+------------------------------------------+ + | | | git_modifiers | masukawa.kentaro | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_at | 2022-01-25 02:29:12 | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxxxxxxx | | + +----------+----------------------+------------------------------------------+--------------------------------------+ | | EC2 | yor_trace | 742ec4a4-e9be-4d62-822c-864b37a02c78 | 742ec4a4-e9be-4d62-822c-864b37a02c78 | + + +----------------------+------------------------------------------+ + | | | git_file | ec2.yml | | + + +----------------------+------------------------------------------+ + | | | git_commit | 26e358cfd4a3bd61069350b4f5828129625cf92e | | + + +----------------------+------------------------------------------+ + | | | git_modifiers | masukawa.kentaro | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_at | 2022-01-25 02:29:12 | | + + +----------------------+------------------------------------------+ + | | | git_last_modified_by | masukawa.kentaro@xxxxxxxxxxxxx | | +---------+----------+----------------------+------------------------------------------+--------------------------------------+
コミットのハッシュ値をタグに付けておけば、最近当該リソースに変更を加えたテンプレートをGithub等で簡単に検索できますね。
このタグだけですべてを追えるとは限らないかもしれませんが、多くの人が関わってるプロジェクトで誰がリソースを変更しているのかを追うことができます。
カスタムタグについて
環境変数を使用して、ユーザーが定義したタグを付与することが可能です。
export YOR_SIMPLE_TAGS='{"team": "devops", "env": "prod"}'
下記のように一括でタグ付けを行えます。
$ yor tag -d . __ __ \ \ / / \ \/ /___ _ ____ \ / _ \| |/ __| | | |_| | / |_|\____/|__|v0.1.133 Yor Findings Summary Scanned Resources: 4 New Resources Traced: 3 Updated Resources: 0 New Resources Traced (3): +---------+----------+---------+-----------+--------------------------------------+ | FILE | RESOURCE | TAG KEY | TAG VALUE | YOR ID | +---------+----------+---------+-----------+--------------------------------------+ | ec2.yml | EIP | env | prod | 3d3b65b6-a9b2-423a-84e2-04d736caf936 | + + +---------+-----------+ + | | | team | devops | | + +----------+---------+-----------+--------------------------------------+ | | IAMRole | env | prod | cf9c2468-54d3-4abc-9eec-bf5cac5b3aef | + + +---------+-----------+ + | | | team | devops | | + +----------+---------+-----------+--------------------------------------+ | | EC2 | env | prod | 9e8c124f-a8e0-48ec-9830-1d62c40fc3fe | + + +---------+-----------+ + | | | team | devops | | +---------+----------+---------+-----------+--------------------------------------+
YAMLの設定ファイルを使用することで、git_modifiersによって所属チームを記したタグを付与するなど柔軟にタグ付けを実施できます。
下記のようなファイルを作成して、--config-fileで参照することで利用可能です。
tag_groups: - name: ownership tags: - name: team_ownership value: default: sre matches: - security_engineering: tags: git_modifiers: - xxx - yyy - platform_engineering: tags: git_modifiers: - aaa - bbb
パイプラインへの埋め込み
本格的に使用していくならパイプラインに埋め込む必要があると思います。
git commitを行った後にYorを実行して再度git commitしないといけないため面倒ですし、Yorの適用し忘れも発生させてしまう可能性が高いです。
下記ブログで紹介されているようにYorをインストールして簡単にGithub Actions等のCI/CDパイプラインへ埋め込むことが可能です。
最後に
まだまだ書き方によっては動かなかったりしたので本格的にパイプラインに組み込むような段階では無いかなと思いましたが、トレーサビリティを高める考え方は面白いと思いました。
DevSecOpsに注力しているBridgecrew社の最新OSSなので注視したいと思います!